// 你是一段成熟的代码，要学会自己改bug
'use strict';

/**
 * 参数
 * @type {{WEB_SOCKET_ADDRESS: string}}
 */
const param = {
    /**
     * webSocket地址
     */
    WEB_SOCKET_ADDRESS : "ws://127.0.0.1:8888/room/",
};

let socket = null;
let vue = null;

const method = {
    /**
     * 获取浏览器的用户信息
     * @return {{name: string, age: string}}
     */
    getUserInfo() {
        let info = {
            infoName: '张三',
            fkUserId: '18'
        };
        return info;
    },
    /**
     * 初始化websocket
     * @param roomURL 房间号（房间地址）
     * @return {WebSocket} websocket对象
     */
    init(roomURL){
        let uri = param.WEB_SOCKET_ADDRESS + roomURL;
        socket = new WebSocket(uri);
        socket.onmessage = this.onMessage;
        socket.onopen = this.onOpen;
        socket.onerror = this.onError;
        socket.onclose = this.close;
        return socket;
    },
    /**
     * 连接建立之后执行send方法发送数据
     */
    onOpen(){
        // 将个人信息发送给后台
        // let info = method.getUserInfo();
        // socket.send(JSON.stringify(info));
    },
    /**
     * 连接建立失败重连
     */
    onError(){
        // this.initWebSocket();
    },
    /**
     * 数据接收
     * @param e 返回的元数据
     */
    onMessage(e){
        // 前端传来的是String数据，转换为json数据
        const data = JSON.parse(e.data);
        // console.log(data);
        // data.flag 显示是否发送成功的信息
        if(data && data.flag) {
            vue[data.handle](data);
        }else {
            console.log(data.data);
        }
    },
    /**
     * 关闭
     */
    close() {
        socket.close();
    },
    /**
     * 发送消息
     * @param action 请求动作
     * @param data 请求数据
     * @param callback 回调方法
     */
    send(action, data, callback) {
        let message = {
            userData: this.getUserInfo(),
            jsonData: data,
            action,
            handle: callback,
        };
        socket.send(JSON.stringify(message));
    }
};

export default {
    /**
     * 获取参数
     * @return {{WEB_SOCKET_ADDRESS: string}}
     */
    getParam() {
        return param;
    },
    /**
     * 初始化
     * @param that vue对象
     * @param roomURL 房间号（房间地址）
     * @return {*} 返回websocket对象
     */
    initWebSocket(that, roomURL) {
        vue = that;
        if(!roomURL) {
            this.$message.error("websocket请求地址异常");
            return null;
        }
        return method.init(roomURL);
    },
    /**
     * 发送消息
     * @param action 请求动作
     * @param data 请求数据
     * @param callback 回调方法
     */
    sendMessage(action, data, callback) {
        method.send(action, data, callback);
    }
}
